package com.catazzz.springbootstudy.common.rabbit;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @作者: Tao
 * @日期: 2025/1/13
 * @时间: 14:43
 * @描述: fanout模式下的消费者<br><pre>
 *     fanout 交换机会将接收到的消息广播到所有绑定到它的队列中，无论绑定键是什么
 */
@Slf4j
@Component
public class FanoutConsumer {


    /**
     * 使用 @RabbitListener 注解监听 RabbitMQ 中的队列<br><pre>
     * 此方法通过 fanout 交换机接收消息，并打印出来
     *
     * RabbitListener：用于定义一个消息监听器。
     * QueueBinding：绑定队列和交换机。
     * Queue：定义队列。
     * Exchange：定义交换机，名称为 fanout，类型为 fanout
     *
     * @param msg 接收到的消息内容
     */
    @RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = "fanout", type = "fanout")))
    public void receive1(String msg) {
        log.info("FanoutConsumer receive1: {}", msg);
    }

    /**
     * 类似于 receive1 方法，此方法也通过 fanout 交换机接收消息，并打印出来
     * 这展示了即使在同一消费者类中，也可以有多个方法通过同一个交换机接收消息
     *
     * @param msg 接收到的消息内容
     */
    @RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = "fanout", type = "fanout")))
    public void receive2(String msg) {
        log.info("FanoutConsumer receive2: {}", msg);
    }
}
